// window.navigator.userAgent
//判断当前浏览器信息

<script src="./jquery.min.js"></script>
//封装一个jq的ajax
$.ajax(
    {
        url:"",
        data: {},
        type: "post",
        success: function(data){},
        error: function(data){},
        timeout: 3000
    }
);


// 每次都判断兼容: 利用惰性思想进行浏览器兼容处理
function getXhr() {
    let arr = [
        function () {
            return new ActiveXObject("Microsoft.XMLHTTP");
        },
        function () {
            return new ActiveXObject("Msxml2.XMLHTTP");
        },
        function () {
            return new ActiveXObject("Msxml3.XMLHTTP");
        },
        function () {
            return new XMLHttpRequest()
        }];
    let flag = false;
    let xhr = null;
    for (let i = 0; i < arr.length; i++) {
        let tempXhr = arr[i];
        try {
            //如果不报错那么就说明当前浏览器支持这个方法, 那么我们把getXhr重写
            xhr = tempXhr();
            flag = true;
            //重写getXhr之后,下次再调用getXhr就不会再执行这些循环和判断了
            getXhr = tempXhr;
            break;
        } catch (e) {
            //如果浏览器报错会执行以下代码, 继续循环下一次,把数组中下一个方法执行
            continue;
        }
    }
    //如果循环执行完毕后 flag还是false 那么说明浏览器四个方法都不兼容
    if(!flag){
        throw new Error("浏览器不支持 ajax")
    }
}

function getUrl(type, url){
    if (type.toLowerCase() === 'get') {
        // data = { name: "haha2", age: 11 }
        let trueUrl;
        // 检查用户是否直接自己在 url 里把参数拼好了
        if (url.indexOf('?') !== -1) {
            trueUrl = url
        } else {
            let arr = [];
            // 遍历对象
            for (let key in data) {
                arr.push(`${key}=${data[key]}`)
            }
            trueUrl = `${url}?${arr.join('&')}`
        }
        return url;
    }
}

function myAjax(options) {


    let xhr = getXhr();
    options.url = getUrl(options.type, options.url);
    xhr.open(options.type, options.url, options.async);//false同步 true异步
    xhr.onreadystatechange = function () {// 监听 回调
//       服务器返回的data

        /*if (xhr.readyState === 4 && xhr.status === 200) {
            console.log("onreadystatechange====>", xhr, xhr.responseText);
            successCB(xhr.responseText)
        }
        if (xhr.readyState === 4 && xhr.status !== 200) {
            errCB({
                status: xhr.status,
                errMsg: xhr.statusText
            })
        }*/

        //接受到服务器请求  0 1 2 3
        if (xhr.readyState === 4){//判断'http事务'是否完成
            //判断相应的状态码
            if(/^2\d{2}$/.test(xhr.status)){//2xx
                options.success && options.success(xhr.responseText);
            }else if(/^(4|5)\d{2}$/.test(xhr.status)){//4xx或者5xx直接抛出错误
                options.error && options.error(xhr.status)
            }
        }
    };
    //send方法中的参数只能是一个字符串
    xhr.send(data);
}

myAjax({
    url:"",
    data: {},
    type: "post",
    success: function(data){},
    error: function(data){},
    timeout: 3000,
    async: true
});